package com.seedwill.common.util;

import java.io.UnsupportedEncodingException;

public class StringCutterHelper {

	//参考PHP
	// function cut_str($sourcestr,$cutlength){
	// $returnstr = '';
	// $i = 0;
	// $n = 0;
	// $str_length = strlen($sourcestr);//字符串的字节数
	// $mb_str_length = mb_strlen($sourcestr,'utf-8');
	// while (($n < $cutlength) && ($i <= $str_length)){
	// $temp_str = substr($sourcestr,$i,1);
	// $ascnum = ord($temp_str);//得到字符串中第$i位字符的ascii码
	// if ($ascnum >= 224){ //如果ASCII位高与224，
	// $returnstr = $returnstr.substr($sourcestr,$i,3);
	// //根据UTF-8编码规范，将3个连续的字符计为单个字符
	// $i = $i + 3; //实际Byte计为3
	// $n++; //字串长度计1
	// }
	// elseif ($ascnum >= 192){ //如果ASCII位高与192，
	// $returnstr = $returnstr.substr($sourcestr,$i,2);
	// //根据UTF-8编码规范，将2个连续的字符计为单个字符
	// $i = $i + 2; //实际Byte计为2
	// $n++; //字串长度计1
	// }
	// elseif ($ascnum >= 65 && $ascnum <= 90){ //如果是大写字母，
	// $returnstr = $returnstr.substr($sourcestr,$i,1);
	// $i = $i + 1; //实际的Byte数仍计1个
	// $n++; //但考虑整体美观，大写字母计成一个高位字符
	// }
	// else{ //其他情况下，包括小写字母和半角标点符号，
	// $returnstr = $returnstr.substr($sourcestr,$i,1);
	// $i = $i + 1; //实际的Byte数计1个
	// $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
	// }
	// }
	// if ($mb_str_length > $cutlength){
	// $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
	// }
	// return $returnstr;
	// }

	/**
	 * 判断是否是一个中文汉字
	 * 
	 * @param c
	 *            字符
	 * @return true表示是多字节文字，false表示是英文字母
	 * @throws UnsupportedEncodingException
	 *             使用了JAVA不支持的编码格式
	 */
	public static boolean isMutiChar(char c, String charset)
			throws UnsupportedEncodingException {
		// 如果字节数大于1，是汉字
		// 以这种方式区别英文字母和中文汉字并不是十分严谨
		return String.valueOf(c).getBytes(charset).length > 1;
	}
	public static boolean isMutiChar(char c)
		throws UnsupportedEncodingException {
		// 如果字节数大于1，是汉字
		// 以这种方式区别英文字母和中文汉字并不是十分严谨
		return String.valueOf(c).getBytes().length > 1;
	}
	public static final int MUTI_UTF8_LEN = 3;

	/**
	 * 按字节截取字符串
	 * 
	 * @param orignal
	 *            原始字符串
	 * @param count
	 *            截取位数
	 * @return 截取后的字符串
	 * @throws UnsupportedEncodingException
	 *             使用了JAVA不支持的编码格式
	 */
	public static String substring(String orignal, int count, String charset)
			throws UnsupportedEncodingException {
		// 原始字符不为null，也不是空字符串
		if (orignal != null && orignal.length()>0) {
			// 将原始字符串转换为指定编码格式
			orignal = new String(orignal.getBytes(), charset);
			// 要截取的字节数大于0，且小于原始字符串的字节数
			// 且count>orignal.length
			if (count > 0 && count < orignal.getBytes(charset).length) {
				StringBuffer buff = new StringBuffer();
				char c;
				for (int i = 0; i < count; i++) {
					// charAt(int index)也是按照字符来分解字符串的
					c = orignal.charAt(i);
					buff.append(c);
					if (StringCutterHelper.isMutiChar(c, charset)) {
						// 遇到中文汉字，截取字节总数减1
						//--count;
						count = count - MUTI_UTF8_LEN;
					}else {
						--count;
					}
				}
				return buff.toString();
			}
		}
		return orignal;
	}
	public static String substring(String orignal, int count)
			throws UnsupportedEncodingException {
		// 原始字符不为null，也不是空字符串
		if (orignal != null && orignal.length()>0) {
			// 将原始字符串转换为指定编码格式
			orignal = new String(orignal.getBytes());
			// 要截取的字节数大于0，且小于原始字符串的字节数
			// 且count>orignal.length
			if (count > 0 && count < orignal.getBytes().length) {
				StringBuffer buff = new StringBuffer();
				char c;
				for (int i = 0; i < count; i++) {
					// charAt(int index)也是按照字符来分解字符串的
					c = orignal.charAt(i);
					buff.append(c);
					if (StringCutterHelper.isMutiChar(c)) {
						// 遇到中文汉字，截取字节总数减1
						//--count;
						count = count - MUTI_UTF8_LEN;
					}else {
						--count;
					}
				}
				return buff.toString();
			}
		}
		return orignal;
	}
	
//	public static void main(String[] args) {
//		String title = "新华网北京9月29日电 (记者孙茂庆、张汨汨、黄明)“完成阅兵任务后，表演队将改装国产最新的歼－10战斗机，空军的飞行表演水平将实现新的飞跃。”空军“八一”飞行表演队队长楼国强日前透露说。";
//		try {
//			System.out.println("原始异常标题:"+title);
//			title = StringCutterHelper.substring(title, 126);
//			System.out.println("处理后异常标题:"+title);
//		} catch (UnsupportedEncodingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
}
